#include "RecursoDeAlmacenamiento.h"
#include "../estrategiaRecurso/Almacenamiento.h"
#include "../estrategiaAlmacenamiento/EstrategiaAlmacenamiento.h"
#include "../estrategiaRecurso/EstrategiaRecurso.h"
#include "../estrategiaAlmacenamiento/Iterador.h"
#include "FabricaCompuestos.h"

RecursoDeAlmacenamiento::RecursoDeAlmacenamiento
(EstrategiaAlmacenamiento* estrAlm,EstrategiaRecurso* estrRec) {

	this->estrategiaAlmacenamiento = estrAlm;
	this->estrategiaRecurso = estrRec;
	this->fabrica = new FabricaCompuestos(); //TODO cambiar con chaja
}

RecursoDeAlmacenamiento::~RecursoDeAlmacenamiento() {

	delete this->estrategiaAlmacenamiento;
	delete this->estrategiaRecurso;
}

offset RecursoDeAlmacenamiento::guardar(Bytes dato, long numComponente) {
	this->estrategiaAlmacenamiento->guardar(dato, numComponente);
	return numComponente;
}

offset RecursoDeAlmacenamiento::getTamanioArchivo() {
	return this->estrategiaRecurso->getTamanioArchivo();
}

bool RecursoDeAlmacenamiento::estaVacio() {
	return (getTamanioArchivo() <= estrategiaAlmacenamiento->getTamanioHeader());
}

void RecursoDeAlmacenamiento::escribir(const Bytes& bytes, offset offset) {
	this->estrategiaRecurso->escribir(bytes,offset);
}

Bytes RecursoDeAlmacenamiento::leer(offset offset, cantBytes cantBytes) {
	return this->estrategiaRecurso->leer(offset,cantBytes);
}

Iterador* RecursoDeAlmacenamiento::getIterador() {
	return estrategiaAlmacenamiento->getIterador();
}

string RecursoDeAlmacenamiento::getPath() {
	return estrategiaRecurso->getPath();
}

void RecursoDeAlmacenamiento::inicializar() {
	if (estaVacio()) {
		estrategiaAlmacenamiento->inicializarArchivo();
	} else if (estrategiaAlmacenamiento->headerCorrupto()) {
		cerr << "el archivo esta corrupto" << endl;
		return;
	}
}

bool RecursoDeAlmacenamiento::setTamanioArchivo(cantBytes tamanio) {
	return this->estrategiaRecurso->setTamanioArchivo(tamanio);
}

void RecursoDeAlmacenamiento::imprimirBuffer() {
	estrategiaRecurso->imprimirBuffer();
}
